iT邦幫忙

2021 iThome 鐵人賽

DAY 11
1

Controller是對URL endpoint處理,我們這裡以兩支API來做範例:

import json

from odoo import _
from odoo.http import Controller, Response, request, route, JsonRequest
from odoo.tools import date_utils

class StudtentController(Controller):
    
    @route('/student/all', methods=['GET'], type='http', auth='public', cors='*', csrf=False)
    def get_student_list(self):
        data = []
        students = request.env['res.student'].sudo().search([])
        for student in students:
            val = {
                'id': student.id,
                'name': student.name,
                'nickname': student.nickname,
                'gender': student.gender
            }
            data.append(val)
        result = {'data': data}
        body = json.dumps(result, default=date_utils.json_default)
        return Response(
            body, status=200,
            headers=[('Content-Type', 'application/json'), ('Content-Length', len(body))]
        )   

    @route('/student', methods=['POST'], type='json', auth='public', cors='*', csrf=False)
    def create_student(self):
        student_data = json.loads(request.httprequest.data)
        val = {
            'name': student_data.get('name'),
            'nickname': student_data.get('nickname'),
            'gender': student_data.get('gender'),
            'birthday': student_data.get('birthday')
        }

        student_obj = request.env['res.student'].sudo()
        student_obj.create(val)
        result = {'code': 200, 'message': 'Created Successfully'}
        body = json.dumps(result, default=date_utils.json_default)
        return Response(
            body, status=200,
            headers=[('Content-Type', 'application/json'), ('Content-Length', len(body))]
        )

Route

@route 裝飾器代表端點以及相關參數設定

第一個參數代表指定的endpoint,所以request url 就是 http://domain/student

methods:代表requests method,這裡是陣列也可以寫入多個requests method,透過ODOO內的request.httprequest.method 分辨後再做想要做的事,以第一隻API為例我們只限定於GET method。

type: 只有jsonhttp兩種,差別在於content type是不是application/json,來限制使用者請求,若不符規定則會返回錯誤。

auth: 有userpublicnone三種,user限定需要使用者在登入狀態,常用在頁面引導,而這邊使用的API則是不需要經由登入認證故寫為public

cors: 開通跨域的參數

crsf: 預設為True ,也就是crsf token認證,這邊我們用API寫法時要改為False

First API

我們第一隻API用來查詢學生資料,透過request.env['res.student'] ,尋找此model底下資料,因為我們在search內沒有加上domain所以會找出所有資料,另外我們可以控制return給使用者的參數,這裡只給id、名字、綽號、性別,性別是會給當初設定的Key值,最後要注意的是,返回的值必須為JSON Object。

HTTP method: GET

URL endpoint: /student/all

Response:

{
    "data": [
        {
            "id": 23,
            "name": "林小美",
            "nickname": "美美",
            "gender": "female"
        },
        {
            "id": 22,
            "name": "王大明",
            "nickname": false,
            "gender": "male"
        },
        {
            "id": 27,
            "name": "陳大熊",
            "nickname": "熊",
            "gender": "male"
        }
    ]
}

Second API

有前面的例子就很簡單了,因我們之前設定birthday欄位為required ,所以新增的時候必須帶入,我們透過create method,ODOO便會根據欄位新增。

HTTP method: POST

URL endpoint: /student

Request body:

{
	"name": "黃小華",
	"nickname": "阿華",
	"gender": "male",
	"birthday": "2020-02-01"
}

Response:

{
    "jsonrpc": "2.0",
    "id": null,
    "result": "<Response 48 bytes [200 OK]>"
}

Result:

https://ithelp.ithome.com.tw/upload/images/20210926/20130896UH5FgyGF1H.png
Controller的介紹就到這了,明天我們來介紹Security


上一篇
Day10 Let's ODOO: View(3) Search View
下一篇
Day12 Let's ODOO: Security(1) Access right
系列文
Let's ODOO 開發與應用30天挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言